package com.itany.corejava.util;

import java.util.Arrays;

/**
 * @author 石小俊
 * @date 2023年05月04日 17:14
 */
public class SortUtil<T> {
    public static void main(String[] args) {
        // 对数组进行排序
        Integer[] nums = {13, 5, 3, 9, 11, 2, 6};
        SortUtil.sort(nums, new SortCompareInterface<Integer>() {
            @Override
            public int compareTo(Integer t1, Integer t2) {
                // 由于模板中是以升序为例实现的
                // 第一个参数比第二个参数大,则交换位置
                // 升序
                // return t1 - t2;
                // 现在需要降序排序
                // 即需要第一个参数比第二个参数小,则交换位置
                // 即:第二个参数比第一个参数大,则交换位置
                // 降序
                return t2 - t1;
            }
        });
        System.out.println(Arrays.toString(nums));

        String[] names = {"admin", "jack", "tom", "alice", "ab", "a"};
        SortUtil.sort(names, new SortCompareInterface<String>() {
            @Override
            public int compareTo(String t1, String t2) {
                // 升序
                return t1.length() - t2.length();
                // 降序
                // return t2.length() - t1.length();
            }
        });
        System.out.println(Arrays.toString(names));
    }

    public static <T> void sort(T[] arr, SortCompareInterface sc) {
        // 对于主体内部,在该方法中进行实现
        // 对于关键步骤,在调用时通过匿名内部类进行实现
        // 关键步骤:对于数字类型,比较大小,关键步骤即为:return t2-t1
        // 对于字符串,比较长度,关键步骤即为:return t1.length - t2.length

        // 外层循环控制比较的轮数
        for (int i = 0; i < arr.length; i++) {
            // 内层循环控制每一轮比较的次数
            for (int j = 0; j < arr.length - 1 - i; j++) {
                int result = sc.compareTo(arr[j], arr[j + 1]);
                // 此时根据返回值不同,判断出谁大谁小
                if (result > 0) {
                    // 此时说明arr[j]比arr[j+1]大
                    T temp = arr[j + 1];
                    arr[j + 1] = arr[j];
                    arr[j] = temp;
                }
            }
        }
    }

}
